package baseclass.l_string;

import java.util.*;

/**
 * 给定一个包含大写字母和小写字母的字符串，找到通过这些字母构造成的最长的回文串。
 * <p>
 * 在构造过程中，请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。
 * <p>
 * 注意:
 * 假设字符串的长度不会超过 1010。
 * <p>
 * 示例 1:
 * <p>
 * 输入:
 * "abccccdd"
 * <p>
 * 输出:
 * 7
 * <p>
 * 解释:
 * 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
 * <p>
 * <p>
 * 分析：如果字符出现次数是偶数，那么肯定能用，可以分立在两边。
 * 如果字符串出现的次数是奇数，那么只能用 奇数 -1 个字符串。
 * 如 aaa bb  ->  abba  或  aaa  bbb -> abba
 * 另外最后的结果必定是偶数，多找一个多余的奇数，放在中间位置。
 * <p>
 * 利用map存储，因为字符最多26*2，所以空间是O(1)
 *
 * @date 2020/3/6 15:04
 */
public class Code06_LongestPalindrome2 {
    public static int longestPalindrome1(String s) {
        if (s == null || s.length() <= 1) {
            return s == null ? 0 : s.length();
        }
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            map.put(c, map.getOrDefault(c, 0) + 1);
        }
        int res = 0;
        boolean flag = true;
        for (Integer integer : map.values()) {
            res += integer / 2 * 2; //如果是偶数都要，如果是奇数就要最大偶数。
            //任何出现奇数的，拿一个放在中间，后面不要了。
            if (flag && (integer % 2 != 0)) {
                res += 1;
                flag = false;
            }
        }
        return res;
    }

    public static void main(String[] args) {
        int i = longestPalindrome1
                ("civilwartestingwhetherthatnaptionoranynartionsoconceivedandsodedicatedcanlongendureWeareqmetonagreatbattlefiemldoftzhatwarWehavecometodedicpateaportionofthatfieldasafinalrestingplaceforthosewhoheregavetheirlivesthatthatnationmightliveItisaltogetherfangandproperthatweshoulddothisButinalargersensewecannotdedicatewecannotconsecratewecannothallowthisgroundThebravelmenlivinganddeadwhostruggledherehaveconsecrateditfaraboveourpoorponwertoaddordetractTgheworldadswfilllittlenotlenorlongrememberwhatwesayherebutitcanneverforgetwhattheydidhereItisforusthelivingrathertobededicatedheretotheulnfinishedworkwhichtheywhofoughtherehavethusfarsonoblyadvancedItisratherforustobeherededicatedtothegreattdafskremainingbeforeusthatfromthesehonoreddeadwetakeincreaseddevotiontothatcauseforwhichtheygavethelastpfullmeasureofdevotionthatweherehighlyresolvethatthesedeadshallnothavediedinvainthatthisnationunsderGodshallhaveanewbirthoffreedomandthatgovernmentofthepeoplebythepeopleforthepeopleshallnotperishfromtheearth");
        System.out.println(i);
    }
}
